<?php
/**
 * Абстрактный класс, обеспечивающий функциональность обнаружения скриптов.
 * См. документацию каждого метода
 *
 * @package mumak
 * @subpackage core
 */
abstract class RL_ConfigProcessor
{
  
	/**
	 * информация о корневых директориях для каждого уровня
	 *
	 * @var array
	 */
  //public $DIRS = array();
  
  /**
   * Ищет скрипт по уровням проектов.
   *
   * @param string $type папка, где лежит скрипт
   * @param string $name имя файла
   * @param int $level с какого уровня начинать поиск
   * @param int $dr направление поиска, возможные значения : -1,0,+1
   * @param string $ext расширение файла
   * @return string имя файла, либо false
   */
  public function findScript( $type, $name, $level = 0, $dr = 1, $ext = 'php' )
  {
    // проверяем входные данные
    if($type=='') {
      $error = "FindScript: <b>*type* пусто</b>, type=<b>$type</b>, name=<b>$name</b>, level=<b>$level</b>, dr=<b>$dr</b>, ext=<b>$ext</b>";
      if( $this->debug ) {
        $this->debug->Error($error);
      } else {
        die($error);
      }
    }
    
    // определяем начальный уровень поиска
    $n = count($this->DIRS);
    if($level === false) {
    	$level = $n - 1;
    }
    $i = $level >= 0 ? $level : $n - $level;

    //  ищем
    for( ; $i >= 0 && $i < $n; $i += $dr ) {
      // разбор каждого уровня тут
      $dir =& $this->DIRS[$i];
      if( !( is_array($dir) && !in_array($type , $dir) ) ) {
        $fname = (is_array($dir) ? $dir[0] : $dir) . $type . "/" . $name . '.' . $ext;
        if(@file_exists($fname)) {
          return $fname;
        }
      }
      
      // если искать только на одном уровне - сразу выходим
      if($dr == 0) {
        break;
      }
    }
    
    //ничего не нашли
    return false;
  }
  
  /**
   * Тоже, что и findScript(), но в случае не обнаружения файла вываливается с ошибкой
   *
   * @param string $type папка, где лежит скрипт
   * @param string $name имя файла
   * @param int $level с какого уровня начинать поиск
   * @param int $dr направление поиска, возможные значения : -1,0,+1
   * @param string $ext расширение файла
   * @return string имя файла, либо false
   */
  public function findScript_( $type, $name, $level=false, $dr=-1, $ext = 'php' )
  {
    $fname = $this->findScript($type,$name,$level,$dr,$ext);
    if($fname) {
      return $fname;
    } else {
      $error = "FindScript: <b>not found</b>, type=<b>$type</b>, name=<b>$name</b>, level=<b>$level</b>, dr=<b>$dr</b>, ext=<b>$ext</b>, fname=<b>$fname</b>";
      if( $this->debug ) {
        $this->debug->Error($error);
      } else {
        die($error);
      }
    }
  }
  
  /**
   * Тоже, что и findScript_(), но кроме того инклюдим найденный скрипт
   *
   * @param string $type папка, где лежит скрипт
   * @param string $name имя файла
   * @param int $level с какого уровня начинать поиск
   * @param int $dr направление поиска, возможные значения : -1,0,+1
   * @param string $ext расширение файла
   * @return bool
   */
  protected function useScript( $type, $name, $level = false, $dr =- 1, $ext = 'php' )
  {
    return $this->_useScript( $this->findScript_($type,$name,$level,$dr,$ext) );
  }
  
  /**
   * Грузит скрипт в контексте меня
   *
   * @param string $source имя файла
   * @return void
   */
  protected function _useScript($source)
  {
    if($source && is_file($source)) {
    	include_once( $source );
    	return true;
    } else {
    	return false;
    }
  }
  
}

?>
